home *** CD-ROM | disk | FTP | other *** search
/ Linux Cubed Series 7: Sunsite / Linux Cubed Series 7 - Sunsite Vol 1.iso / system / news / inn1.000 / inn1.4sec-linux-src.tar / inn / innd / innd.h < prev    next >
C/C++ Source or Header  |  1993-03-18  |  11KB  |  527 lines

  1. /*  $Revision: 1.41 $
  2. **
  3. **  Many of the data types used here have abbreviations, such as CT
  4. **  for CHANNELTYPE.  Here are a list of the conventions and meanings:
  5. **    ART    A news article
  6. **    CHAN    An I/O channel
  7. **    CS    Channel state
  8. **    CT    Channel type
  9. **    FNL    Funnel, into which other feeds pour
  10. **    FT    Feed type -- how a site gets told about new articles
  11. **    ICD    In-core data (primarily the active and sys files)
  12. **    LC    Local NNTP connection-receiving channel
  13. **    CC    Control channel (used by ctlinnd)
  14. **    NC    NNTP client channel
  15. **    NG    Newsgroup
  16. **    NGH    Newgroup hashtable
  17. **    PROC    A process (used to feed a site)
  18. **    PS    Process state
  19. **    RC    Remote NNTP connection-receiving channel
  20. **    RCHAN    A channel in "read" state
  21. **    SITE    Something that gets told when we get an article
  22. **    WCHAN    A channel in "write" state
  23. */
  24. #include "configdata.h"
  25. #include <stdio.h>
  26. #include <ctype.h>
  27. #include <errno.h>
  28. #include <signal.h>
  29. #include <sys/types.h>
  30. #include <sys/stat.h>
  31. #if    defined(DO_NEED_TIME)
  32. #include <time.h>
  33. #endif    /* defined(DO_NEED_TIME) */
  34. #include <sys/time.h>
  35. #include <sys/socket.h>
  36. #include <netinet/in.h>
  37. #include <fcntl.h>
  38. #include "nntp.h"
  39. #include "paths.h"
  40. #include "logging.h"
  41. #include "libinn.h"
  42. #include "clibrary.h"
  43. #include "macros.h"
  44.  
  45.  
  46. #define NOSITE        -1
  47.  
  48.  
  49. /*
  50. **  Some convenient shorthands.
  51. */
  52. typedef struct in_addr    INADDR;
  53.  
  54.  
  55. /*
  56. **  Server's operating mode.
  57. */
  58. typedef enum _OPERATINGMODE {
  59.     OMrunning,
  60.     OMpaused,
  61.     OMthrottled
  62. } OPERATINGMODE;
  63.  
  64.  
  65. /*
  66. **  An I/O buffer, including a size, an amount used, and a count of how
  67. **  much space is left if reading or how much still needs to be written.
  68. */
  69. typedef struct _BUFFER {
  70.     int        Size;
  71.     int        Used;
  72.     int        Left;
  73.     char    *Data;
  74. } BUFFER;
  75.  
  76.  
  77. /*
  78. **  What program to handoff a connection to.
  79. */
  80. typedef enum _HANDOFF {
  81.     HOnnrpd,
  82.     HOnnrqd,
  83.     HOnntpd
  84. } HANDOFF;
  85.  
  86.  
  87. /*
  88. **  Set of channel types.
  89. */
  90. typedef enum _CHANNELTYPE {
  91.     CTany,
  92.     CTfree,
  93.     CTremconn,
  94.     CTnntp,
  95.     CTlocalconn,
  96.     CTcontrol,
  97.     CTfile,
  98.     CTexploder,
  99.     CTprocess
  100. } CHANNELTYPE;
  101.  
  102.  
  103. /*
  104. **  The state a channel is in.  Interpretation of this depends on the
  105. **  channel's type.  Used mostly by CTnntp channels.
  106. */
  107. typedef enum _CHANNELSTATE {
  108.     CSerror,
  109.     CSwaiting,
  110.     CSgetcmd,
  111.     CSgetauth,
  112.     CSwritegoodbye,
  113.     CSwriting,
  114.     CSpaused,
  115.     CSgetarticle,
  116.     CSeatarticle,
  117.     CSgetrep
  118. } CHANNELSTATE;
  119.  
  120.  
  121. /*
  122. **  I/O channel, the heart of the program.  A channel has input and output
  123. **  buffers, and functions to call when there is input to be read, or when
  124. **  all the output was been written.
  125. */
  126. typedef struct _CHANNEL {
  127.     CHANNELTYPE        Type;
  128.     CHANNELSTATE    State;
  129.     int            fd;
  130.     int            Reported;
  131.     long        Received;
  132.     long        Refused;
  133.     long        Rejected;
  134.     int            BadWrites;
  135.     int            BadReads;
  136.     int            BlockedWrites;
  137.     int            BadCommands;
  138.     time_t        LastActive;
  139.     time_t        NextLog;
  140.     INADDR        Address;
  141.     FUNCPTR        Reader;
  142.     FUNCPTR        WriteDone;
  143.     time_t        Waketime;
  144.     time_t        Started;
  145.     FUNCPTR        Waker;
  146.     POINTER        Argument;
  147.     POINTER        Event;
  148.     BUFFER        In;
  149.     BUFFER        Out;
  150.     BOOL        Tracing;
  151. } CHANNEL;
  152.  
  153.  
  154. /*
  155. **  A newsgroup has a name in different formats, and a high-water count,
  156. **  also kept in different formats.  It also has a list of sites that
  157. **  get this group.
  158. */
  159. typedef struct _NEWSGROUP {
  160.     long        Start;        /* Offset into the active file    */
  161.     char        *Name;
  162.     char        *Dir;        /* The name, as a directory    */
  163.     int            NameLength;
  164.     ARTNUM        Last;
  165.     ARTNUM        Filenum;    /* File name to use        */
  166.     int            Lastwidth;
  167.     int            PostCount;    /* Have we already put it here?    */
  168.     char        *LastString;
  169.     char        *Rest;
  170.     int            nSites;
  171.     int            *Sites;
  172.     struct _NEWSGROUP    *Alias;
  173. } NEWSGROUP;
  174.  
  175.  
  176. /*
  177. **  How a site is fed.
  178. */
  179. typedef enum _FEEDTYPE {
  180.     FTerror,
  181.     FTfile,
  182.     FTchannel,
  183.     FTexploder,
  184.     FTfunnel,
  185.     FTlogonly,
  186.     FTprogram
  187. } FEEDTYPE;
  188.  
  189.  
  190. /*
  191. **  A site may reject something in its subscription list if it has
  192. **  too many hops, or a bad distribution.
  193. */
  194. typedef struct _SITE {
  195.     char        *Name;
  196.     char        *Entry;
  197.     int            NameLength;
  198.     char        **Exclusions;
  199.     char        **Distributions;
  200.     char        **Patterns;
  201.     BOOL        Sendit;
  202.     BOOL        Seenit;
  203.     BOOL        DistRequired;
  204.     BOOL        IgnorePath;
  205.     int            Hops;
  206.     int            Groupcount;
  207.     FEEDTYPE        Type;
  208.     NEWSGROUP        *ng;
  209.     BOOL        Spooling;
  210.     char        *SpoolName;
  211.     BOOL        Working;
  212.     long        StartWriting;
  213.     long        StopWriting;
  214.     long        StartSpooling;
  215.     char        *Param;
  216.     char        FileFlags[FEED_MAXFLAGS + 1];
  217.     long        MaxSize;
  218.     CHANNEL        *Channel;
  219.     BOOL        IsMaster;
  220.     int            Master;
  221.     int            Funnel;
  222.     BOOL        FNLwantsnames;
  223.     BUFFER        FNLnames;
  224.     int            Process;
  225.     PID_T        pid;
  226.     int            Flushpoint;
  227.     BUFFER        Buffer;
  228.     BOOL        Buffered;
  229.     struct _SITE    *Next;
  230.     struct _SITE    *Prev;
  231. } SITE;
  232.  
  233.  
  234. /*
  235. **  A process is something we start up to send articles.
  236. */
  237. typedef enum _PROCSTATE {
  238.     PSfree,
  239.     PSrunning,
  240.     PSdead
  241. } PROCSTATE;
  242.  
  243.  
  244. /*
  245. **  We track our children and collect them synchronously.
  246. */
  247. typedef struct _PROCESS {
  248.     PROCSTATE    State;
  249.     PID_T    Pid;
  250.     int        Status;
  251.     time_t    Started;
  252.     time_t    Collected;
  253.     int        Site;
  254. } PROCESS;
  255.  
  256.  
  257. /*
  258. **  Miscellaneous data we want to keep on an article.  All the fields
  259. **  are not always valid.
  260. */
  261. typedef struct _ARTDATA {
  262.     STRING    Poster;
  263.     STRING    Replyto;
  264.     char    *Body;
  265.     time_t    Posted;
  266.     time_t    Arrived;
  267.     time_t    Expires;
  268.     int        Groupcount;
  269.     int        LinesValue;
  270.     char    Lines[SMBUF];
  271.     long    SizeValue;
  272.     char    Size[SMBUF];
  273.     int        SizeLength;
  274.     char    Name[SPOOLNAMEBUFF];
  275.     int        NameLength;
  276.     char    TimeReceived[33];
  277.     int        TimeReceivedLength;
  278.     STRING    MessageID;
  279.     int        MessageIDLength;
  280.     STRING    Newsgroups;
  281.     int        NewsgroupsLength;
  282.     STRING    Distribution;
  283.     int        DistributionLength;
  284.     STRING    Feedsite;
  285.     int        FeedsiteLength;
  286.     STRING    Replic;
  287.     int        ReplicLength;
  288.     BUFFER    *Headers;
  289.     BUFFER    *Overview;
  290. } ARTDATA;
  291.  
  292.  
  293.  
  294.  
  295. /*
  296. **  In-line macros for efficiency.
  297. */
  298.  
  299. #if    defined(lint) || defined(__CENTERLINE__)
  300. extern int    KeepLintQuiet;
  301. #define JUSTONCE    KeepLintQuiet
  302. #else
  303. #define JUSTONCE    0
  304. #endif    /* defined(lint) || defined(__CENTERLINE__) */
  305.  
  306. /*
  307. **  Set or append data to a channel's output buffer.
  308. */
  309. #define WCHANset(cp, p, l)    BUFFset(&(cp)->Out, (p), (l))
  310. #define WCHANappend(cp, p, l)    BUFFappend(&(cp)->Out, (p), (l))
  311.  
  312.  
  313. /*
  314. **  Append data to a buffer.
  315. */
  316. #define BUFFappend(bp_parm, p_parm, l_parm) \
  317.     do { \
  318.     register int    l_; \
  319.     register BUFFER    *bp_; \
  320.     int        i_; \
  321.     \
  322.     if ((l_ = l_parm) != 0) { \
  323.         bp_ = bp_parm; \
  324.         /* Note end of buffer, grow it if we need more room. */ \
  325.         i_ = bp_->Used + bp_->Left; \
  326.         if (i_ + l_ > bp_->Size) { \
  327.         /* Round size up to next 1K. */ \
  328.         bp_->Size += (l_ + 0x3FF) & ~0x3FF; \
  329.         RENEW(bp_->Data, char, bp_->Size); \
  330.         } \
  331.         bp_->Left += l_; \
  332.         if (l_ > MEMCPY_THRESHOLD) \
  333.         (void)memcpy((POINTER)&bp_->Data[i_], (POINTER)p_parm, (SIZE_T)l_); \
  334.         else { \
  335.         register STRING    p_; \
  336.         register char    *dest_; \
  337.     \
  338.         for (p_ = p_parm, dest_ = &bp_->Data[i_], l_++; --l_ > 0; ) \
  339.             *dest_++ = *p_++; \
  340.         } \
  341.     } \
  342.     } while (JUSTONCE)
  343.  
  344.  
  345. /*
  346. **  Mark that an I/O error occurred, and block if we got too many.
  347. */
  348. #define IOError(WHEN)    \
  349.     if (--ErrorCount <= 0 || errno == ENOSPC) ThrottleIOError(WHEN); else
  350.  
  351.  
  352. /*
  353. **  Global data.
  354. */
  355. #if    defined(DEFINE_DATA)
  356. #define EXTERN        /* NULL */
  357. #else
  358. #define EXTERN        extern
  359. #endif    /* defined(DEFINE_DATA) */
  360. EXTERN BOOL        AlwaysCrosspost;
  361. extern BOOL        AmRoot;
  362. extern BOOL        BufferedLogs;
  363. EXTERN BOOL        AmSlave;
  364. EXTERN BOOL        AnyIncoming;
  365. extern BOOL        Debug;
  366. EXTERN BOOL        ICDneedsetup;
  367. EXTERN BOOL        NeedHeaders;
  368. EXTERN BOOL        NeedOverview;
  369. EXTERN BOOL        NNRPFollows;
  370. extern BOOL        NNRPTracing;
  371. extern BOOL        Tracing;
  372. EXTERN BUFFER        Path;
  373. EXTERN BUFFER        Xref;
  374. EXTERN char        *ModeReason;    /* NNTP reject message        */
  375. EXTERN char        *NNRPReason;    /* NNRP reject message        */
  376. EXTERN char        *Reservation;    /* Reserved lock message    */
  377. EXTERN char        *RejectReason;    /* NNTP reject message        */
  378. extern char        SPOOL[];
  379. EXTERN char        *Version;
  380. EXTERN FILE        *Errlog;
  381. EXTERN FILE        *Log;
  382. extern char        LogName[];
  383. EXTERN INADDR        MyAddress;
  384. extern int        ErrorCount;
  385. EXTERN int        ICDactivedirty;
  386. extern int        MaxIncoming;
  387. EXTERN int        MaxOutgoing;
  388. EXTERN int        nGroups;
  389. EXTERN int        nSites;
  390. EXTERN int        PROCneedscan;
  391. extern int        SPOOLlen;
  392. EXTERN int        Xrefbase;
  393. extern long        LargestArticle;
  394. EXTERN NEWSGROUP    **GroupPointers;
  395. EXTERN NEWSGROUP    *Groups;
  396. extern OPERATINGMODE    Mode;
  397. EXTERN SIGVAR        GotTerminate;
  398. EXTERN SITE        *Sites;
  399. EXTERN SITE        ME;
  400. EXTERN struct timeval    TimeOut;
  401. EXTERN TIMEINFO        Now;        /* Reasonably accurate time    */
  402. extern time_t        Cutoff;
  403.  
  404.  
  405. /*
  406. **  Function declarations.
  407. */
  408. extern BOOL        FormatLong();
  409. extern BOOL        MakeSpoolDirectory();
  410. extern BOOL        NeedShell();
  411. extern char        **CommaSplit();
  412. extern char        *MaxLength();
  413. extern int        Spawn();
  414. extern NORETURN        CleanupAndExit();
  415. extern void        FileGlue();
  416. extern void        JustCleanup();
  417. extern void        ThrottleIOError();
  418. extern void        ReopenLog();
  419. extern void        xchown();
  420.  
  421. extern BOOL        ARTidok();
  422. extern BOOL        ARTreadschema();
  423. extern char        *ARTreadarticle();
  424. extern char        *ARTreadheader();
  425. extern STRING        ARTpost();
  426. extern void        ARTcancel();
  427. extern void        ARTclose();
  428. extern void        ARTsetup();
  429.  
  430. extern void        BUFFset();
  431.  
  432. extern BOOL        CHANsleeping();
  433. extern CHANNEL        *CHANcreate();
  434. extern CHANNEL        *CHANiter();
  435. extern CHANNEL        *CHANfromdescriptor();
  436. extern char        *CHANname();
  437. extern int        CHANreadtext();
  438. extern void        CHANclose();
  439. extern void        CHANreadloop();
  440. extern void        CHANsetup();
  441. extern void        CHANtracing();
  442.  
  443. extern void        RCHANadd();
  444. extern void        RCHANremove();
  445.  
  446. extern void        SCHANadd();
  447. extern void        SCHANremove();
  448. extern void        SCHANwakeup();
  449.  
  450. extern BOOL        WCHANflush();
  451. extern void        WCHANadd();
  452. extern void        WCHANfappend();
  453. extern void        WCHANremove();
  454. extern void        WCHANsetfrombuffer();
  455.  
  456. extern void        CCcopyargv();
  457. extern STRING        CCblock();
  458. extern STRING        CCcancel();
  459. extern STRING        CCcheckfile();
  460.  
  461. extern BOOL        HIShavearticle();
  462. extern BOOL        HISwrite();
  463. extern char        *HISfilesfor();
  464. extern void        HISclose();
  465. extern void        HISsetup();
  466. extern void        HISsync();
  467.  
  468. extern BOOL        ICDnewgroup();
  469. extern char        *ICDreadactive();
  470. extern BOOL        ICDchangegroup();
  471. extern void        ICDclose();
  472. extern void        ICDrenumberactive();
  473. extern BOOL        ICDrmgroup();
  474. extern void        ICDsetup();
  475. extern void        ICDwrite();
  476. extern void        ICDwriteactive();
  477.  
  478. extern void        CCclose();
  479. extern void        CCsetup();
  480.  
  481. extern void        LCclose();
  482. extern void        LCsetup();
  483.  
  484. extern char        **NGsplit();
  485. extern NEWSGROUP    *NGfind();
  486. extern CHANNEL        *NCcreate();
  487. extern void        NGparsefile();
  488. extern BOOL        NGrenumber();
  489.  
  490. extern void        NCclose();
  491. extern void        NCsetup();
  492.  
  493. extern int        PROCwatch();
  494. extern void        PROCunwatch();
  495. /* extern void        PROCclose(); */
  496. extern void        PROCscan();
  497. extern void        PROCsetup();
  498.  
  499. extern BOOL        RCnolimit();
  500. extern BOOL        RCauthorized();
  501. extern BOOL        RCcanpost();
  502. extern char        *RChostname();
  503. extern int        RCismaster();
  504. extern void        RCclose();
  505. extern void        RChandoff();
  506. extern void        RCreadlist();
  507. extern void        RCsetup();
  508.  
  509. extern BOOL        SITEfunnelpatch();
  510. extern BOOL        SITEsetup();
  511. extern BOOL        SITEwantsgroup();
  512. extern char        **SITEreadfile();
  513. extern SITE        *SITEfind();
  514. extern SITE        *SITEfindnext();
  515. extern STRING        SITEparseone();
  516. extern void        SITEchanclose();
  517. extern void        SITEdrop();
  518. extern void        SITEflush();
  519. extern void        SITEflushall();
  520. extern void        SITEforward();
  521. extern void        SITEfree();
  522. extern void        SITElinkall();
  523. extern void        SITEparsefile();
  524. extern void        SITEprocdied();
  525. extern void        SITEsend();
  526. extern void        SITEwrite();
  527.